package com.ylfstu.jdbc.datasource;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.junit.jupiter.api.Test;

import java.beans.PropertyVetoException;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

/**
 * @Author: Joy_yang
 * @Date: 2022/10/20 14:55
 * 演示C3P0使用
 */
public class C3P0_ {

    //方式1： 相关参数，在程序中指定 url user password
    @Test
    public void testC3P0_01() throws IOException, PropertyVetoException, SQLException {
        //1. 创建一个数据源对象
        ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
        //2. 通过配置文件 获取相关连接信息
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\mysql.properties"));
        String url = properties.getProperty("url");
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String driver = properties.getProperty("driver");

        //给数据源 comboPooledDataSource 设置相关的参数
        //注意： 连接管理是由 comboPooledDataSource 来管理的
        comboPooledDataSource.setDriverClass(driver);
        comboPooledDataSource.setJdbcUrl(url);
        comboPooledDataSource.setUser(user);
        comboPooledDataSource.setPassword(password);
        //设置初始化连接数
        comboPooledDataSource.setInitialPoolSize(10);
        //设置最大连接数
        comboPooledDataSource.setMaxPoolSize(50);
        long start = System.currentTimeMillis();
        //测试连接池效率， 测试对mysql 连接5000次
        for (int i = 0; i < 5000; i++) {
            Connection connection = comboPooledDataSource.getConnection();// 这个方法就是从 DataSource 实现的
//            System.out.println("连接成功...");
            connection.close();
        }
        long end = System.currentTimeMillis();
        //传统方式接连5000次 耗时=12616
        //C3P0 5000次连接Mysql 耗时=605
        System.out.println("C3P0 5000次连接Mysql 耗时=" + (end - start));
    }

    //方式二： 使用配置文件模板来完成
    @Test
    public void testC3P0_02() throws SQLException {
        //1. 将c3p0 提供的 c3p0-config.xml 拷贝到 src目录下
        //2. 该文件指定了连接数据库和线程池的相关参数
        ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource("ylf_stu");
        //测试 5000次连接mysql
        long start = System.currentTimeMillis();
        System.out.println("开始连接...");
        for (int i = 0; i < 500000; i++) {
            Connection connection = comboPooledDataSource.getConnection();
//            System.out.println("连接成功...");
            connection.close();
        }
        long end = System.currentTimeMillis();
        //传统方式接连5000次 耗时=12616
        //C3P0第二种方式 耗时=654
        //C3P0第二种方式(500000) 耗时=3267
        System.out.println("C3P0第二种方式(500000) 耗时=" + (end - start));
    }
}








